library(tidyverse)
library(GGally)
library(reshape)
Em análise exploratória, com frequência queremos examinar se há associação entre duas variáveis numéricas. Para descrever uma associação como essa, há pelo menos quatro características importantes:
Conselho importante: não há um número apenas que possa lhe responder tudo sobre a associação entre as duas variáveis. As medidas de correlação que você usará servirão mais para complementar e quantificar observações feitas em gráficos de dispersão do que para lhe guiar.
Um exemplo classico com quatro pares de variáveis cujas associações interessam: x1 e y1, x2 e y2, etc., o quarteto de Anscombe:
summary(anscombe)
x1 x2 x3 x4 y1 y2 y3
Min. : 4.0 Min. : 4.0 Min. : 4.0 Min. : 8 Min. : 4.260 Min. :3.100 Min. : 5.39
1st Qu.: 6.5 1st Qu.: 6.5 1st Qu.: 6.5 1st Qu.: 8 1st Qu.: 6.315 1st Qu.:6.695 1st Qu.: 6.25
Median : 9.0 Median : 9.0 Median : 9.0 Median : 8 Median : 7.580 Median :8.140 Median : 7.11
Mean : 9.0 Mean : 9.0 Mean : 9.0 Mean : 9 Mean : 7.501 Mean :7.501 Mean : 7.50
3rd Qu.:11.5 3rd Qu.:11.5 3rd Qu.:11.5 3rd Qu.: 8 3rd Qu.: 8.570 3rd Qu.:8.950 3rd Qu.: 7.98
Max. :14.0 Max. :14.0 Max. :14.0 Max. :19 Max. :10.840 Max. :9.260 Max. :12.74
y4
Min. : 5.250
1st Qu.: 6.170
Median : 7.040
Mean : 7.501
3rd Qu.: 8.190
Max. :12.500
# um pouco de rearrumação primeiro.
# (para entender melhor, você pode procurar sobre dados em formato
# wide ou long no R)
t1 <- melt(select(anscombe, 1:4), id = c())
t2 <- melt(select(anscombe, 5:8), id = c())
names(t2) <- c("v2", "value2")
dados <- data.frame(vars = paste(t1$variable, "e", t2$v2),
v1 = t1$value,
v2 = t2$value2)
Calculando a correlação linear:
E se olharmos os dados?
ggplot(dados, aes(v1, v2)) +
geom_point(color = "darkorange", size = 4, alpha = 0.7) +
theme_bw() +
scale_x_continuous(breaks = seq(0, 20, 2)) +
scale_y_continuous(breaks = seq(0, 12, 2)) +
expand_limits(x = 0, y = 0) +
facet_wrap(~ vars)
Quatro relações diferentes, mesma quantificação. Para o segundo grupo, não há uma relação linear. No 3o, há uma relação perfeita entre a maioria das observações, com uma exceção. No 4o grupo não há relação; há uma exceção que faz parecer que há uma relação.
O que os outros coeficientes podem nos dizer?
dados %>%
group_by(vars) %>%
summarise(pearson = cor(v1, v2, method = "pearson"),
spearman = cor(v1, v2, method = "spearman"),
kendall = cor(v1, v2, method = "kendall"))
Dito isso, essa figura ajuda a lembrar a relação entre o valor esperado do coeficiente (linear) e vários tipos de associação entre duas variáveis:
da wikipedia
Relação linear:
set.seed(123)
x <- rnorm(100) * 100
tamanho_do_erro <- 50
y <- 0.5 * x + rnorm(100) * tamanho_do_erro + 20
df <- data.frame(x = x,
y = y)
ggplot(df, aes(x = x, y = y)) +
geom_point(colour = "darkgrey", size = 4) +
theme_bw()
cor(df$x, df$y, method = "pearson")
[1] 0.66713
# Dobro de erro em torno de uma função linear f(x)
df$y <- 0.5 * x + rnorm(100) * tamanho_do_erro * 2 + 20
ggplot(df, aes(x = x, y = y)) +
geom_point(colour = "darkgrey", size = 4) +
theme_bw()
cor(df$x, df$y, method = "pearson")
[1] 0.3339445
Relação não linear
n = 100
df <- data.frame(x = runif(n, min= 1, max = 20))
df$y = 100 * exp(-1.2 * df$x) #+ rnorm(n, mean = 0.05, sd = 1)
ggplot(df, aes(x = x, y = y)) +
geom_point(colour = "darkgrey", size = 4)
ggplot(df, aes(x = x, y = y)) +
geom_point(colour = "darkgrey", size = 4) +
scale_y_log10()
# tente descomentando o scale_y_log10 acima e veja o que acontece
cor(df$x, df$y)
[1] -0.540947
cor(df$x, df$y, method = "spearman")
[1] -1
cor(df$x, df$y, method = "kendall")
[1] -1
Quando considerando várias variáveis, o mais prático é usar uma matriz de gráficos de dispersão:
ggpairs(dados)
plot: [1,1] [===-----------------------------------------------------------------------------] 4% est: 0s
plot: [1,2] [======--------------------------------------------------------------------------] 8% est: 3s
plot: [1,3] [==========----------------------------------------------------------------------] 12% est: 8s
plot: [1,4] [=============-------------------------------------------------------------------] 16% est: 8s
plot: [1,5] [================----------------------------------------------------------------] 20% est: 7s
plot: [2,1] [===================-------------------------------------------------------------] 24% est: 6s
plot: [2,2] [======================----------------------------------------------------------] 28% est: 6s
plot: [2,3] [==========================------------------------------------------------------] 32% est: 5s
plot: [2,4] [=============================---------------------------------------------------] 36% est: 4s
plot: [2,5] [================================------------------------------------------------] 40% est: 4s
plot: [3,1] [===================================---------------------------------------------] 44% est: 4s
plot: [3,2] [======================================------------------------------------------] 48% est: 4s
plot: [3,3] [==========================================--------------------------------------] 52% est: 4s
plot: [3,4] [=============================================-----------------------------------] 56% est: 3s
plot: [3,5] [================================================--------------------------------] 60% est: 3s
plot: [4,1] [===================================================-----------------------------] 64% est: 2s
plot: [4,2] [======================================================--------------------------] 68% est: 2s
plot: [4,3] [==========================================================----------------------] 72% est: 2s
plot: [4,4] [=============================================================-------------------] 76% est: 2s
plot: [4,5] [================================================================----------------] 80% est: 1s
plot: [5,1] [===================================================================-------------] 84% est: 1s
plot: [5,2] [======================================================================----------] 88% est: 1s
plot: [5,3] [==========================================================================------] 92% est: 1s
plot: [5,4] [=============================================================================---] 96% est: 0s
plot: [5,5] [================================================================================]100% est: 0s
names(diamonds)
[1] "carat" "cut" "color" "clarity" "depth" "table" "price" "x" "y" "z"
ggplot(diamonds, aes(x = carat, y = price)) +
geom_hex()
ggplot(diamonds, aes(x = price)) +
geom_histogram() +
scale_x_log10()
ggpairs(dados)
plot: [1,1] [===-----------------------------------------------------------------------------] 4% est: 0s
plot: [1,2] [======--------------------------------------------------------------------------] 8% est: 1s
plot: [1,3] [==========----------------------------------------------------------------------] 12% est: 3s
plot: [1,4] [=============-------------------------------------------------------------------] 16% est: 4s
plot: [1,5] [================----------------------------------------------------------------] 20% est: 4s
plot: [2,1] [===================-------------------------------------------------------------] 24% est: 4s
plot: [2,2] [======================----------------------------------------------------------] 28% est: 4s
plot: [2,3] [==========================------------------------------------------------------] 32% est: 4s
plot: [2,4] [=============================---------------------------------------------------] 36% est: 4s
plot: [2,5] [================================------------------------------------------------] 40% est: 3s
plot: [3,1] [===================================---------------------------------------------] 44% est: 3s
plot: [3,2] [======================================------------------------------------------] 48% est: 3s
plot: [3,3] [==========================================--------------------------------------] 52% est: 3s
plot: [3,4] [=============================================-----------------------------------] 56% est: 3s
plot: [3,5] [================================================--------------------------------] 60% est: 3s
plot: [4,1] [===================================================-----------------------------] 64% est: 2s
plot: [4,2] [======================================================--------------------------] 68% est: 2s
plot: [4,3] [==========================================================----------------------] 72% est: 2s
plot: [4,4] [=============================================================-------------------] 76% est: 2s
plot: [4,5] [================================================================----------------] 80% est: 1s
plot: [5,1] [===================================================================-------------] 84% est: 1s
plot: [5,2] [======================================================================----------] 88% est: 1s
plot: [5,3] [==========================================================================------] 92% est: 0s
plot: [5,4] [=============================================================================---] 96% est: 0s
plot: [5,5] [================================================================================]100% est: 0s